package com.freetymekiyan.algorithms.level.medium;

import java.util.Arrays;

/**
 * You are given coins of different denominations and a total amount of money amount. Write a function to compute the
 * fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any
 * combination of the coins, return -1.
 * <p>
 * Example 1:
 * coins = [1, 2, 5], amount = 11
 * return 3 (11 = 5 + 5 + 1)
 * <p>
 * Example 2:
 * coins = [2], amount = 3
 * return -1.
 * <p>
 * Note:
 * You may assume that you have an infinite number of each kind of coin.
 * <p>
 * Tags: Dynamic Programming
 */
public class CoinChange {

    public int coinChange(int[] coins, int amount) {
        int[] res = new int[amount + 1];
        Arrays.fill(res, 1, amount + 1, amount + 1);
        for (int coin : coins) {
            for (int i = coin; i < res.length; i++) {
                res[i] = Math.min(res[i], res[i - coin] + 1);
            }
        }
        return res[amount] == amount + 1 ? -1 : res[amount];
    }

}
